#ifndef DEALFILEMANGER_H
#define DEALFILEMANGER_H

#include <QObject>
#include <QDebug>


///********************************
///
/// qml 与qt 测试通信
///
/// main.cpp中
///   qmlRegisterType<DealFileManger>("DealFileMangerModel",1,0,"DealFileManger");
///
/// 使用的qml中：
/// import DealFileMangerModel 1.0
///
///
///     DealFileManger{
/// id:dealFileManger
///  //无法使用，无法确定原因
/// onSigCheckFileFlagChanged: {console.log("FileFlagChanged")}}
///
///
///**********************************

//C++类要想被QML访问，首先必须满足两个条件：
//一是派生自QObject类或QObject类的子类，
//二是使用Q_OBJECT宏。QObject类是所有Qt对象的基类，作为Qt对象模型的核心，提供了信号与槽机制等很多重要特性。
//Q_OBJECT宏必须在private区（C++默认为private）声明，用来声明信号与槽，使用Qt元对象系统提供的内容，
//位置一般在语句块首行。Projects选择Qt Quick Application，工程名为DealFileManger。


//DealFileManger类中的信号sigCheckData()和槽sltCheckData()都可以被QML访问。
//槽必须声明为public或protected，信号在C++中使用时要用到emit关键字，
//但在QML中就是个普通的函数，用法同函数一样，信号处理器形式为on，Signal首字母大写。
//信号不支持重载，多个信号的名字相同而参数不同时，能够被识别的只是最后一个信号，与信号的参数无关。


class DealFileManger : public QObject
{
    Q_OBJECT

public:
    explicit DealFileManger(QObject *parent = 0);

signals:
    void sigCheckData(const QString checkStr);
public slots:
    void sltCheckData(const QString checkStr);

protected:

    //QML中访问C++成员函数
    Q_INVOKABLE void checkData(const QString checkStr);

/******************************************************/
///////////////QML使用枚举类型////////////////////////////
public:
    //C++类中添加了public的CheckFileFlag枚举类型，枚举类型要想在QML中使用，需要使用Q_ENUMS()宏。
    enum CheckFileFlag{
    MdFlag, //枚举类型首字母要大写
    TextFlag
    };

    //可以对函数成员进行重载
    Q_INVOKABLE void checkData(const QString checkStr,CheckFileFlag flag);

    Q_ENUMS(CheckFileFlag)

    CheckFileFlag m_checkFlag=MdFlag;
/*||||||||||||||||||||||||||||||||||||||||||||||||||||||*/
/********************************************************/




/******************************************************/
///////////////QML使用属性////////////////////////////
public:
    Q_PROPERTY(CheckFileFlag checkFileFlag READ checkFileFlag WRITE setcheckFileFlag NOTIFY sigCheckFileFlagChanged)

    CheckFileFlag checkFileFlag() const
    {
        return m_checkFlag;
    }

    void setcheckFileFlag(const CheckFileFlag &flag)
    {
        if(flag != m_checkFlag)
        {
            m_checkFlag =  flag;
            emit sigCheckFileFlagChanged();
        }

  qDebug() << "C++类中添加了Q_PROPERTY()宏，用来在QObject派生类中声明属性，属性同类的数据成员一样，但又有一些额外的特性可通过Qt元对象系统来访问." << "\n"
        <<  "Q_PROPERTY()(type name (READ getFunction [WRITE setFunction] | MEMBER memberName [(READ getFunction | WRITE setFunction)])"<< "\n"
        <<             "[RESET resetFunction]"<< "\n"
        <<             "[NOTIFY notifySignal]"<< "\n"
        <<             "[REVISION int]"<< "\n"
        <<             "[DESIGNABLE bool]"<< "\n"
        <<             "[SCRIPTABLE bool]"<< "\n"
        <<             "[STORED bool]"<< "\n"
        <<             "[USER bool]"<< "\n"
        <<             "[CONSTANT]"<< "\n"
        <<             "[FINAL])"<< "\n"
        <<"属性的type、name是必需的，其它是可选项，常用的有READ、WRITE、NOTIFY。属性的type可以是QVariant支持的任何类型，也可以是自定义类型，包括自定义类、列表类型、组属性等。另外，属性的READ、WRITE、RESET是可以被继承的，也可以是虚函数，不常用."<< "\n"
        <<"READ：读取属性值，如果没有设置MEMBER的话，是必需的。一般情况下，函数是个const函数，返回值类型必须是属性本身的类型或这个类型的const引用，没有参数."<< "\n"
        <<"WRITE：设置属性值，可选项。函数必须返回void，有且仅有一个参数，参数类型必须是属性本身的类型或类型的指针或引用."<< "\n"
        <<"NOTIFY：与属性关联的可选信号，信号必须在类中声明过，当属性值改变时，就可触发信号，可以没有参数，有参数的话只能是一个类型同属性本身类型的参数，用来记录属性改变后的值.";


    }
signals:
    void sigCheckFileFlagChanged();
/*||||||||||||||||||||||||||||||||||||||||||||||||||||||*/
/********************************************************/

};

#endif // DEALFILEMANGER_H
